#include <cstdio> // #include <stdio.h>

#define N 6

void fn() {
  int n = 10;
}

int inputs[N];

int main(int argc, char const *argv[])
{
  /* code */
  // 一、传统 C++ 中的输入和输出
  // -std=c++17 Modern C++ 
  // -std=c++98 Legacy C++
  // scanf 从键盘读取输入 / printf 打印、输出
  int a = 0, b = 0;
  // %d - 整数
  scanf("%d %d"/*输入模板*/, &a, &b);
  printf("a=%d b=%d\n"/*输出模板*/, a, b);

  char c = 'A';
  printf("c = %c\n", c);
  printf("c = %d\n", c);

  // 二、传统 C++ 中的数组
  // vector<int> / vector<char> / vector<bool>
  // 数组元素的类型 数组变量的名字[数组元素的个数]
  int numbers[N] = {1, 2, 3, 4, 5}; // 有 5 个整数元素的数组
  for (int i = 0; i < N; ++i) {
    printf("numbers[%d]: [%d] inputs[%d]: [%d]\n", i, numbers[i], i, inputs[i]);
  }

  char characters[5] = {'A', 'B', 'C', 'D', 'E'};

  for (int i = 0; i < 5; ++i) {
    printf("%d ", numbers[i]);
  }

  // 三、C++ 中局部变量和全局变量
  // 所有写在一对大括号之间的变量，都叫做局部变量。
  // 其他的叫全局变量。
  // C++ 会把全局变量设置成默认值，局部变量不会。

  // 四、宏
  // 宏就是某个值的符号表述

  // 五、字符串
  // <string> string s {"Hello"};
  // 5.1 字符串的字面量
  // 当我们要在 C++ 中表达一个值为 Hello 的字符串的时候，它不能修改内容
  char *greetings = "Hello";
  const char *greeting = "Hello";

  // 5.2 字符串变量
  char greetings1[] = "Hello";
  char greetings1[8] = "Hello"; // 'H', 'e', 'l', 'l', 'o', '\0', '\0', '\0'
  
  // 在 C++ 里，所有字符串的末尾，会自动追加一个 '\0'
  // char name[] = "ABC\0ABC";
  // printf("%s", name); ___ABC____

  // 六、必考但不怎么常用的操作符
  // >> 按位（按二进制位）右移操作符
  // 本质就是把原始的数字，除以 2^位移
  int bn = 0b1000;                 // 8 
  int n1 = bn >> 1; // 1000 -> 0100 = 4
  int n2 = bn >> 2; // 1000 -> 0010 = 2
  int n3 = bn >> 3; // 1000 -> 0001 = 1
  //
  // << 按位（按二进制位）左移操作符
  // 本质就是把原始数字，乘以 2^位移
  int cn = 0b0001; // 1
  int n4 = cn << 1; // 2
  int n5 = cn << 2; // 4
  int n6 = cn << 3; // 8
  //
  // 按位 & | ^
  //
  int b1 = 0b110;
  int b2 = 0b101;
  // 110
  // 101
  //^011
  int b3 = b1 & b2; // 与运算 0b100
  int b4 = b1 | b2; // 或运算 0b111
  int b5 = b1 ^ b2; // 异或运算 0b011

  return 0;
}
